﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <ctype.h>
#include <errno.h>

//结构体的创建
//struct St
//{
//	char name[20];
//	char id[30];
//	int age;
//};
//int main()
//{
//	struct St s1 = { "tangyanglin","20222211058",21 };;
//	struct St s2 = { .age = 18,.name = "lisi",.id = 20222211057 };
//
//	printf("%s %s %d", s1.name, s1.id, s1.age);
//
//	return 0;
//}

//struct S1//结构体创建
//{
//	char c1;//对齐数：1 8 1 偏移量：0
//	char c2;//对齐数：1 8 1 偏移量：1
//	int i;  //对齐数：4 8 4 偏移量：4
//};
//struct S2//结构体创建
//{
//	char c1;//对齐数：1 8 1 偏移量：0
//	int i;  //对齐数：4 8 4 偏移量：4
//	char c2;//对齐数：1 8 1 偏移量：8
//};
//struct S3
//{
//	double d;//对齐数：8 8 8
//	char c;//对齐数：1 8 1
//	int i;//对齐数：4 8 4
//};
//struct S4
//{
//	char c1;//对齐数：1 8 1 偏移量：0
//	struct S3 s3;//对齐数：16 8 8 偏移量：8
//	double d;//8 8 8 偏移量：24
//	分析：
//		1.c1放在0偏移处，占1个字节//1.
//		2.s3只需要对齐自己嵌套里面成员最大对齐数的倍数，再放S3所占结构体大小。//浪费空间+所占空间=7+16
//		3.找到d最大对齐数的倍数，再放d自身大小。//8
//		4.总共占23 + 1 + 8 = 32
//		5.结构体总大小：因为满足嵌套结构体，所有对齐数包括嵌套结构体的最大对齐数的倍数。
//};
//int main()
//{
//	//初始化 - 结构体初始化用大括号
//	struct S1 s1 = { 0 };
//	struct S1 s2 = { 0 };
//
//	//计算结构体的大小
//	printf("%zd\n", sizeof(struct S1));//8 - 计算考虑对其原则1.2
//	printf("%zd\n", sizeof(struct S2));//12 - 计算考虑对其原则1.2.3
//	printf("%zd\n", sizeof(struct S3));//16 - 计算考虑对其原则1.2.3
//	printf("%zd\n", sizeof(struct S3));//32 - 计算考虑对其原则1.2.3.4
//
//	//计算结构体成员的偏移量
//	printf("%zd\n", offsetof(struct S2, c1));
//	printf("%zd\n", offsetof(struct S2, i));
//	printf("%zd\n", offsetof(struct S2, c2));
//
//	return 0;
//}


//#pragma pack(1)//设置默认对⻬数为1
//struct S
//{
//	char c1;
//	int i;
//	char c2;
//};
//int main()
//{
//	//输出的结果是什么？
//	printf("%d\n", sizeof(struct S));//6
//	return 0;
//}